package Pakke;

import java.util.ArrayList;
import java.io.Serializable;
import java.util.Collections;
import java.util.Locale;
import java.util.regex.*;

/**
 * LTimerData.java
 * @author arni
 *
 * Klassen skal være serializable og comperable. Comperable basert på navn.
 *
 * Denne klassen er kjernedataklassen. Den inneholder all informasjon om
 * timerobjektene.
 *
 *
 */

public class LTimerData implements Serializable, Comparable<LTimerData> {

    
    private String name;
    private String notification;

    private ArrayList<LTimerAlternative> lTimerAlternative;
    private int defaultTimerAlternative;
    private boolean favourite;

    /**
     * Konstruktøren oppretter timer med et navn, en varsling, tre(eller mindre) tidsalternativer,
     * en int som viser hvilken av de tre tidsalternativer som blir valgt og
     * om det er en favoritt-timer eller ikke.
     *
     * @param name navn på timeren
     * @param notification navn på varsling til timer
     * @param lTidsAlternativer en ArrayList med tidsalternativer
     * @param defaultTimerAlternative en int som viser hvilken av tre timeralternativ som blir valgt
     * @param favourite Hvis true, så er timeren en favoritt
     * @see LTimerAlternative
     */
    public LTimerData(String name, String notification, ArrayList<LTimerAlternative> lTidsAlternativer, int defaultTimerAlternative, boolean favourite) {
        setName(name);
        setNotification(notification);
        this.lTimerAlternative = lTidsAlternativer;
        setDefaultTimerAlternative(defaultTimerAlternative);
        setFavourite(favourite);
    }



    /**
     * Returnerer navnet på timeren
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * Setter navn på en timer
     * @param name
     * @return
     */
    public boolean setName(String name) {
        if (checkString(name)) {
           this.name = name;
           return true;
        }
        return false;
    }


    /**
     * Returnerer varslingen
     * @return
     */
    public String getNotification() {
        return notification;
    }

    /**
     * Setter en notification.
     * Her sjekkes det også om en varsling finnes i listen over notifications før den sendes inn.
     *
     * @param notification the notification to set
     * @return
     */
    public boolean setNotification(String notification) {
        if (checkString(notification)) {
           this.notification = notification;
           return true;
        }
        return false;
    }

    /**
     * Returnerer en ArrayList med tidsalternativer
     * @return lTidsAlternativer tidsalternativer
     */
    public ArrayList<LTimerAlternative> getlTidsAlternativer() {
        return lTimerAlternative;
    }

    /**
     * Setter tidsalternativer
     * @param lTimerAlternative en ArrayList av LTimerAlternative
     */
    public void setlTidsAlternativer(ArrayList<LTimerAlternative> lTimerAlternative) {
        this.lTimerAlternative = lTimerAlternative;
    }

    /**
     * Returnerer alternativet som er satt som default
     * @return the defaultTimerAlternative
     */
    public int getDefaultTimerAlternative() {
        return defaultTimerAlternative;
    }


    /**
     * Setter et alternativ som default, men sjekker først om alternativet er ok
     *
     * @param defaultTimerAlternative the defaultTimerAlternative to set
     * @return Return true if Default Timer Alternative is set ok
     */
    public boolean setDefaultTimerAlternative(int defaultTimerAlternative) {
        if (checkDefaultTimerAlternative(defaultTimerAlternative)){
            this.defaultTimerAlternative = defaultTimerAlternative;
            return true;
        }
        return false;
        
    }

    /**
     * Sjekker om defaultTimerAlternative er ok
     * @param defaultTimerAlternative
     * @return return true if parameter is valid
     */
    private boolean checkDefaultTimerAlternative(int defaultTimerAlternative) {
        if (lTimerAlternative.size() <= defaultTimerAlternative) return false;
        if (defaultTimerAlternative < 0) return false;
        return true;
    }

    /**
     * Returnerer true dersom timer-objektet er en favoritt
     * @return
     */
    public boolean getFavourite() {
        return favourite;
    }

    /**
     * Setter favoritt
     * @param favourite
     *
     */
    public void setFavourite(boolean favourite) {
        this.favourite = favourite;
    }
    /**
     * Sjekker om en string er ok, dvs bestående av bokstaver, tall og/eller mellomrom
     * @return true if String is clean
     */
    private boolean checkString(String name) {
        Locale locale = new Locale("no", "NO");
        Locale.setDefault(locale);
        if(name.trim().equals("")) return false;
        Pattern p = Pattern.compile("[^a-zA-Z0-9 øæåÆØÅ]");
        Matcher m = p.matcher(name);
        if(m.find()) return false;
        return true;
    }

    /**
     * Sammenligning basert på navn
     * @param o Objekt av LTimerData
     */
    public int compareTo(LTimerData o) {
        int i = o.getName().compareToIgnoreCase(name);
        if (i < 0) return 1;
        if (i > 0) return -1;
        return 0;

    }

    /**
     *
     * @param navn Navnet på det nye tidsalternativet
     * @param tidMs Tid i millisek på det nye tidsalternativet
     * @return  Returnerer true hvis tidsalternativet var i orden og ble lagt til
     */
    public boolean newLTimerAlternative(String navn, int tidMs) {
        if (checkString(navn)) {
            for(LTimerAlternative lta: lTimerAlternative) {
                if(lta.getName().equalsIgnoreCase(navn)) {
                    return false;
                }
            }
            lTimerAlternative.add(new LTimerAlternative(navn, tidMs));
            Collections.sort(lTimerAlternative);
            return true;
           }
        return false;

    }

    /**
     *
     * Returnerer en string med navn, varsling, og om den er favoritt eller ikke,
     * i tillegg til toString til LTimerAlternative
     * @see LTimerAlternative
     *
     */
    @Override
    public String toString() {
        String r = "";
        r = r + "Name: " + name + " Notification: " + notification + " ";
        if (favourite) r = r + "Favoritt ";
        for(LTimerAlternative lta: lTimerAlternative) {
            r = r + lta.toString();
        }
        return r;
    }

}
